import { defineStore } from 'pinia';
import { getToken, removeToken, setToken } from '../utils/token-utils';
import type { UserInfoState } from './interface';
import {ElMessage} from 'element-plus'
import {reqLogin,reqUserInfo,reqLogOut} from '@/api/acl/login'
import {staticRoutes,allAsyncRoutes,anyRoute } from '@/router/routes'
import router from '@/router';
import _ from 'lodash'


/**
 * 用户信息
 * @methods setUserInfos 设置用户信息
 */


  
//计算出当前用户将来需要动态追加的异步路由结果
   const  fineUserAsyncRoutes = (allAsyncRoutes:any,routes:any)=>{
          return  allAsyncRoutes.filter((item:any)=>{
            // 过滤一级路由
              if(routes.indexOf(item.name) !=-1){
                // 过滤二级路由
                if(item.children && item.children.length>0){
                  item.children = fineUserAsyncRoutes(item.children,routes)
                }
                return true;
              }

          })
    }



export const useUserInfoStore = defineStore('userInfo', {

	state: (): UserInfoState => ({
    token: getToken() as string,
    name: '',
    avatar: '',
    menuRoutes: []
  }),

	actions: {
    // 点击登录按钮:仓库发登录请求
  async  login (username: string, password: string) {
      // 登录请求:如果登录成功,返回token
      try {
        let result = await reqLogin({username,password});
        // 仓库存储token
        console.log(123);
        
        this.token = result.token;
        // 持久化存储token
        setToken(result.token)
        return 'ok'

      } catch (error) {
        // 登录失败
        return Promise.reject('失败')
      }
    },

    // 获取用户信息
  async  getInfo () {
   try {
     // 登录成功,获取用户信息,切记别忘记携带token,请求拦截器中
     let result = await reqUserInfo()
     // 获取用户名字,头像
     this.name = result.name;
     this.avatar = result.avatar
    //  计算出当前用户需要展示的异步路由
    let userRegisterAsyncRoute = fineUserAsyncRoutes(_.cloneDeep(allAsyncRoutes),result.routes);
    // console.log(userRegisterAsyncRoute);
    //调用方法动态添加路由
    this.setRoute([...userRegisterAsyncRoute,anyRoute])
    // console.log("11111111")
     // 修改仓库里面menuRoutes的属性值    左侧导航区的菜单栏展示内容
     this.menuRoutes = [...staticRoutes,...userRegisterAsyncRoute]
    //  console.log(this.menuRoutes,111122);
     
     return 'ok'
    
   } catch (error) {
    return Promise.reject(error)
   }
    },

    // 退出登录
 async   reset () {
     try {
      await reqLogOut ()
       // 删除local中保存的token
       removeToken()
       // 提交重置用户信息的mutation
       this.token = ''
       this.name = ''
       this.avatar = ''
      //  重置路由
      this.resetRoute()
   
       return 'ok'
     } catch (error) {
      return Promise.reject(error)
     }
    },

    // 重置路由方法
    resetRoute(){
      // 当前用户退出登录,应该清空全部异步路由
      // 获取当前用户全部路由信息
      let allRoutes = router.getRoutes()
      // 用户退出登录 ,全部的路由清除
      allRoutes.forEach((item:any)=>{
        // 删除全部路由
          router.removeRoute(item.name)
      });
      // 常量路由: 动态添加上
      staticRoutes.forEach((item:any)=>{
          router.addRoute(item)
      })
    },

    // 动态添加路由 
    setRoute(reginster:any){
      reginster.forEach((item:any) => {
        // 动态添加路由用路由器的addRoute方法
            router.addRoute(item)
      });
    },

	},
});
